Page 4 of 4 FirstFirst ... 234
Results 31 to 37 of 37

Thread: Help with Weapon Swapping

  1. #31
    Developer Sor's Avatar
    Join Date
    Aug 2010
    Location
    The Medieval City of Bruges
    Posts
    747

    Default

    Technically, I wrote it so it should find the correct player regardless of identical IPs. But it's night here, so I'll debug this more thoroughly tomorrow.
    Morpheus Script (MoH) => You try to shoot yourself in the foot only to discover that MorpheusScript already shot your foot for you.

  2. #32
    Developer Sor's Avatar
    Join Date
    Aug 2010
    Location
    The Medieval City of Bruges
    Posts
    747

    Default

    Okay, I was referring to 'local.sessionSwapData' instead of 'level.sessionSwapData' in the "GetSwapDataForClient" thread. So that's my bad. :P
    This is the PoC that's as it should working on my local reborn server:
    Code:
    main:
        //testing
        //println (registerev "connected" reborn/poc2.scr::Connected)
        //println (registerev "spawn" reborn/poc2.scr::Spawn) 
        //println (registerev "intermission" reborn/poc2.scr::Intermission)
        waitthread Decompile;
        level waittill spawn; 
    end;
    
    GlobVar:
        level.valSep = ",";    //"¶" (ASCII ext); separator character to separate the values
        level.entrSep = ";";  //"¦" (ASCII ext); separator character to separate (player) entries 
    end;
    
    
    Connected local.player:
        local.player waitthread GetSwapDataForClient;
    end;
    
    Intermission local.type:
        waitthread Compile;
    end;
    
    Compile:
        // println "COMPILE"
        local.cvarStr = "";
        for (local.i = 1; local.i <= $player.size; local.i++) {
            local.player = $player[local.i];
            
            // Catches all NILs
            if (local.player.swap != "1") {
                local.player.swap = "0"
            }
            
            /// Compilation phase.. no need to cast to string :)
            // Add             player's name            value separator        player's ip            value separator        player's property        entry separator
            local.cvarStr += ((netname local.player) + (level.valSep) + (getip local.player) + (level.valSep) + (local.player.swap) + (level.entrSep));
        }
        
        setcvar "sessionSwapData" local.cvarStr;
    end;
    
    Decompile:
        // println "DECOMPILE"
        // Load compilation variables
        waitthread GlobVar;
        
        // Break 'sessionSwapData' string into strings of the entries.
        level.sessionSwapData = waitthread Split (getcvar("sessionSwapData")) level.entrSep;
        // No longer needed;
        setcvar "sessionSwapData" "";
        
        // Save initial size (We're going to remove elements without reconcatenating  
        // the array later on to save time and resources).
        level.sessionSwapDataSize = level.sessionSwapData.size;
        
        // Array of strings isn't empty (this means the cvar "sessionSwapData" wasn't empty)
        if (0 < level.sessionSwapDataSize) {
            // Split values as well and create a two-dimensional array.
            for (local.i = 1; local.i <= level.sessionSwapDataSize; local.i++) {
                // Now split entry string into its 3 value strings. In our compile phase,
                // each value had a fixed position. This is maintained. :)
                level.sessionSwapData[local.i] = waitthread Split level.sessionSwapData[local.i] level.valSep;
            }
        }
    end;
    
    GetSwapDataForClient:
        local.result = 0;
        for (local.i = 1; local.i <= level.sessionSwapDataSize; local.i++) {
            // Element is not inexistent and is an array which 
            // contains a valid amount of elements itself.
            if (level.sessionSwapData[local.i].size == 3) {
                if ((getip self) == level.sessionSwapData[local.i][2]) {
                    if ((netname self) == level.sessionSwapData[local.i][1]) {
                        // Player was found!
                        // He did not disconnect during mapchange...
                        self.swap = level.sessionSwapData[local.i][3];
                        
                        // No need to keep this set of data anymore (frees memory and
                        // makes this algorithm run faster next time).
                        level.sessionSwapData[local.i] = NIL;
                        
                        // exit
                        local.result = 1;
                        break;
                    }
                }
            }
        }
    end local.result;
    
    Split local.string local.spacer:
        local.strSize = local.string.size;
        // HACK! Efficiently prevents console from producing an
        // 'out-of-range' error at the second spacer check.
        local.string += local.spacer;
        
        local.word = 1;
        local.result[local.word] = "";
        for (local.i = 0; local.i < local.strSize; local.i++) {
            if (local.spacer == local.string[local.i]) {
                if (local.string[(local.i + 1)] != local.spacer) {
                    if(local.result[local.word] != "") {
                        local.word++;
                        local.result[local.word] = "";
                    }
                }
                continue;
            }
            local.result[local.word] += local.string[local.i];
        }
    end local.result;
    Take another look at the separator characters; I've commented out two characters of the ASCII extended (128+) table
    and only ASCII 32-126 can be used in playernames.
    Last edited by Sor; February 15th, 2013 at 07:06 AM.
    Morpheus Script (MoH) => You try to shoot yourself in the foot only to discover that MorpheusScript already shot your foot for you.

  3. #33
    Purple Developer Purple Elephant1au's Avatar
    Join Date
    Feb 2012
    Location
    Australia
    Posts
    1,259

    Default

    Hi

    I copied and pasted the above codes, except main: the iprint events part ,

    Commenting out those parts that dnt work before i test next part , to rule out one cause and found two

    Problem with connection event , crashes server when 1st round ends

    Problem with intermission event , crashes server when 2nd round ends

    Restart server and changed maps before players join

    Nothing shows up in logs , no reborn errors or anything



    Full script below

    Exec from dmprecache.scr , Tried exec script before and after level waittill spawn but no such luck
    Code:
    main:
    
    //local.result = registerev "spawn" global/custom/weapons.scr::spawn
    
    local.result = registerev "connected" global/custom/weapons.scr::connected
    
    local.result = registerev "intermission" global/custom/weapons.scr::intermission
    
    level.mef_pstatecallbacks.spawned = global/custom/weapons.scr::spawn
    
    thread get_cvars
    
    thread weapon_message
    
    teamswitchdelay .2
    
    waitthread Decompile;
    
    level waittill spawn;
    
    end;
    ////////////////////////////////////////////
    
    GlobVar:
    	level.valSep = ","	//"¶" //seperator character to seperate the values
    	level.entrSep = ";" //"¦" //seperator character to seperate (player) entries 
    end;
    
    ///////////////////////////////////////////////////
    
    Connected local.player:
    	local.player waitthread GetSwapDataForClient;
    end;
    
    ///////////////////////////////////////////////////
    
    Intermission local.type:
    	waitthread Compile;
    end;
    
    ///////////////////////////////////////////////////
    
    Compile:
    	println "COMPILE"
    	local.cvarStr = "";
    	for (local.i = 1; local.i <= $player.size; local.i++) {
    		local.player = $player[local.i];
    		
    		// Catches all NILs
    		if (local.player.swap != "1") {
    			local.player.swap = "0"
    		}
    		
    		/// Compilation phase.. no need to cast to string :)
    		// Add 			player's name			value seperator		player's ip			value seperator		player's property		entry seperator
    		local.cvarStr += ((netname local.player) + (level.valSep) + (getip local.player) + (level.valSep) + (local.player.swap) + (level.entrSep));
    	}
    	
    	setcvar "sessionSwapData" local.cvarStr;
    end;
    
    ///////////////////////////////////////////////////
    
    Decompile:
    	println "DECOMPILE"
    	// Load compilation variables
    	waitthread GlobVar;
    	
        // Break 'sessionSwapData' string into strings of the entries.
        level.sessionSwapData = waitthread Split (getcvar("sessionSwapData")) level.entrSep;
        // No longer needed;
        setcvar "sessionSwapData" "";
    	
        // Save initial size (We're going to remove elements without reconcatenating  
        // the array later on to save time and resources).
        level.sessionSwapDataSize = level.sessionSwapData.size;
        
        // Array of strings isn't empty (this means the cvar "sessionSwapData" wasn't empty)
        if (0 < level.sessionSwapDataSize) {
            // Split values as well and create a two-dimensional array.
            for (local.i = 1; local.i <= level.sessionSwapDataSize; local.i++) {
                // Now split entry string into its 3 value strings. In our compile phase,
                // each value had a fixed position. This is maintained. :)
                level.sessionSwapData[local.i] = waitthread Split level.sessionSwapData[local.i] level.valSep;
            }
        }
    end;
    
    ///////////////////////////////////////////////////
    
    GetSwapDataForClient:
    	local.result = 0;
    	for (local.i = 1; local.i <= level.sessionSwapDataSize; local.i++) {
    		// Element is not inexistent and is an array which 
    		// contains a valid amount of elements itself.
    		if (level.sessionSwapData[local.i].size == 3) {
    			if ((getip self) == level.sessionSwapData[local.i][2]) {
    				if ((netname self) == level.sessionSwapData[local.i][1]) {
    					// Player was found!
    					// He did not disconnect during mapchange...
    					self.swap = level.sessionSwapData[local.i][3];
    					
    					// No need to keep this set of data anymore (frees memory and
    					// makes this algorithm run faster next time).
    					level.sessionSwapData[local.i] = NIL;
    					
    					// exit
    					local.result = 1;
    					break;
    				}
    			}
    		}
    	}
    end local.result;
    
    ///////////////////////////////////////////////////
    
    Split local.string local.spacer:
        local.strSize = local.string.size;
        // HACK! Efficiently prevents console from producing an
        // 'out-of-range' error at the second spacer check.
        local.string += local.spacer;
        
        local.word = 1;
        local.result[local.word] = "";
        for (local.i = 0; local.i < local.strSize; local.i++) {
            if (local.spacer == local.string[local.i]) {
                if (local.string[(local.i + 1)] != local.spacer) {
                    if(local.result[local.word] != "") {
                        local.word++;
                        local.result[local.word] = "";
                    }
                }
                continue;
            }
            local.result[local.word] += local.string[local.i];
        }
    end local.result;
    
    //////////////////////////////
    
    spawn local.player:
    
    waitthread weapon_check local.player
    
    thread weapon_swap local.player
    
    end
    
    
    ////////////////////////////////////////////////////////////
    ////////////// Weapon Check Part ///////////////////////////
    
    weapon_check local.player:
    
    wait 0.6
    
    if(local.player != NULL && local.player != NIL && isAlive(local.player) && local.player.dmteam != spectator && !local.player.checked)
    {
    
    local.player iprint "Start Check"
    
    		local.player weaponcommand dual targetname ("weap" + local.player.entnum )
    		local.player.weapon = $("weap" + local.player.entnum ).model
    		
    		if(local.player.weapon != NIL && local.player.weapon != NULL)
    		
    		{
    				for (local.i = 1; local.i <= level.notallowed.size; local.i++) 
    				{
    					   if(local.player.weapon == level.notallowed[local.i])
    						{	
    								local.player take level.notallowed[local.i]
    								local.player iprint "Not Allowed"
    														if(getcvar(pe_weapon_choice) != "1")
    														{ 
    														local.player give models/weapons/KAR98sniper.tik
    														local.player use models/weapons/KAR98sniper.tik
    														local.player primarydmweapon sniper
    														}
    														if(getcvar(pe_weapon_choice) == "1")
    														{
    														local.player spectator
    														local.player stufftext "pushmenu SelectPrimaryWeapon"
    														}
    								
    										if(getcvar(pe_weapon_message) == "1") 
    														{
    															local.player iprint ("The Weapon you chose is unavailable") 1
    															local.player iprint (level.allowed) 1
    															//local.player iprint ("So here is a Sniper") 1	
    														}
    								
    						}
    						local.player.checked = 1
    						
    									
    				}
    		}
    		
    
    
    
    local.player iprint "End Check"
    
    }
    
    wait 0.5
    local.player.checked = 0	
    end
    
    
    ////////////////////////////////////////////////////////////
    ////////////// Weapon Swap Part ///////////////////////////
    
    
    weapon_swap local.player:
    
        if (getcvar(pe_weapon_swap) == "1") 
        {
            if(local.player && isAlive(local.player) && local.player.dmteam == "allies")
    		
    	      {
                local.player iprint "Swap Start"
                local.player weaponcommand dual targetname ("weap" + local.player.entnum )
                local.player.weapon = $("weap" + local.player.entnum ).model
                
                switch(local.player.weapon)
                {
                    case "models/weapons/springfield.tik":
                        local.take = "models/weapons/springfield.tik"
                        local.takename = "Springfield"
                        local.give = "models/weapons/KAR98sniper.tik"
                        local.givename = "Kar98Sniper"
                    break
                     
                    case "models/weapons/m1_garand.tik":
                        local.take = "models/weapons/m1_garand.tik"
                        local.takename = " M1 Garand"
                        local.give = "models/weapons/kar98.tik"
                        local.givename = "Mausar kar98"
                    break
                    default:
                        end
                }
                
                wait 1    
            
                if(local.player && isAlive(local.player) && local.player.dmteam != "spectator")
                {
                    if(local.player.swap == "1")
                    {
                        local.player take local.take
    					local.player take rifle
                        local.player give local.give
                        local.player iprint (local.takename + " has been swapped for " + local.givename) 1
                        local.player use local.give
                        local.player iprint ("Hold 'Use' again to change back") 1
    
    
                        local.wait = 3.0
                        while(local.player.useheld && 0.0 < local.wait) {
                            wait 0.25
                            local.wait -= 0.25
                        }
                        
                        if (local.wait <= 0.0) {
                            local.player take local.give
    						local.player take rifle
                            local.player give local.take                    
                            local.player use local.take
                            local.player.swap = "0"
    						
                        }
    					 
                    } else {  
    				local.player iprint ("Hold 'Use' for 3 Seconds to change") 1
    					wait 1
                        local.wait = 2.0
                        while(local.player.useheld && 0.0 < local.wait) {
                            wait 0.25
                            local.wait -= 0.25
                        }
                        
                        if (local.wait <= 0.0) {
                            local.player take local.take
    						local.player take rifle
                            local.player give local.give
                            local.player iprint (local.takename + " has been swapped for " + local.givename) 1
                            local.player use local.give
                            local.player.swap = "1"
    						 
    						
                        }
                    }
    				 
    				local.player iprint "Swap End"
    				
    				  
                }
    			
            }
          
        }
     wait 0.5
    
    
    
    
    end
    
    get_cvars:
    
    //////////////////////////////
    level.notallowed[1] = ""
    level.notallowed[2] = ""
    level.notallowed[3] = ""
    level.notallowed[4] = ""
    level.notallowed[5] = ""
    level.notallowed[6] = ""
    level.notallowed[7] = ""
    level.notallowed[8] = ""
    level.notallowed[9] = ""
    level.notallowed[10] = ""
    level.notallowed[11] = ""
    //////////////////////////////////////////////////////////////
    //////////////////////  Get Cvars ////////////////////////////
    
    if(getcvar(PE_mg) == "0")
    		{
    			level.notallowed[1] = "models/weapons/bar.tik"
    			level.notallowed[2] = "models/weapons/mp44.tik"
    		}
    
    if(getcvar(PE_rocket) == "0")
    		{
    			level.notallowed[3] = "models/weapons/bazooka.tik"
    			level.notallowed[4] = "models/weapons/panzerschreck.tik"
    		}
    
    if(getcvar(PE_shotgun) == "0")
    		{
    			level.notallowed[5] = "models/weapons/shotgun.tik"
    		}
    
    if(getcvar(PE_rifle) == "0")
    		{
    			level.notallowed[6] = "models/weapons/m1_garand.tik"
    			level.notallowed[7] = "models/weapons/kar98.tik"
    		}
    
    if(getcvar(PE_sniper) == "0")
    		{
    			level.notallowed[8] = "models/weapons/springfield.tik"
    			level.notallowed[9] = "models/weapons/KAR98sniper.tik"
    		}
    
    if(getcvar(PE_smg) == "0")
    		{
    			level.notallowed[10] = "models/weapons/thompsonsmg.tik"
    			level.notallowed[11] = "models/weapons/mp40.tik"
    		}
    
    if(getcvar(PE_pistol) == "0")
    		{
    			level.player take "models/weapons/colt45.tik"
    			level.player take "models/weapons/p38.tik"
    		}
    
    if(getcvar(PE_grenade) == "0")
    		{
    			level.player take "models/weapons/m2frag_grenade.tik"
    			level.player take "models/weapons/steilhandgranate.tik"
    		}
    
    end
    /////////////////////////////////////////////////////////////
    /////////////////////// Message Part /////////////////////////
    
    weapon_message:
    
    level.allowed = "Allowed Weapons:"
        if (getcvar(pe_allweapons) == "1") 
            level.allowed += " All Weapons "
        else
        {
            if (getcvar(pe_pistol) == "1") 
                level.allowed += " Pistol,"
            if (getcvar(pe_rifle) == "1")
                level.allowed += " Rifle,"
            if (getcvar(pe_sniper) == "1") 
                level.allowed += " Sniper,"
            if (getcvar(pe_smg) == "1") 
                level.allowed += " SMG,"
            if (getcvar(pe_mg) == "1") 
                level.allowed += " MG,"
            if (getcvar(pe_grenade) == "1") 
                level.allowed += " Grenades,"
            if (getcvar(pe_shotgun) == "1") 
                level.allowed += " Shotgun,"
            if (getcvar(pe_rocket) == "1") 
                level.allowed += " Rocket,"
    
        }
    
    end
    Last edited by Purple Elephant1au; February 15th, 2013 at 03:54 AM.

    Purple's Playground
    OBJ :
    103.29.85.127:12203
    xfire: purpleelephant1au
    email: purpleelephant1au@gmail.com
    skydrive: PurpleElephantSkydrive




  4. #34
    Developer Sor's Avatar
    Join Date
    Aug 2010
    Location
    The Medieval City of Bruges
    Posts
    747

    Default

    My advice is: be VERY careful when using copy or paste when working on a code... because I always write my threadnames/functionames in PascalCase not lowercase.
    So event executes script and nothing is found -> crash.
    Morpheus Script (MoH) => You try to shoot yourself in the foot only to discover that MorpheusScript already shot your foot for you.

  5. #35
    Purple Developer Purple Elephant1au's Avatar
    Join Date
    Feb 2012
    Location
    Australia
    Posts
    1,259

    Default

    Hi

    Its working sort of...

    It works fine on certain maps and not properly on others ,

    Like it works fine on some customs ones ,

    ie Renan , Stlo , Rockbound

    Doesnt work on stock ones at all , so v2 , bridge , hunt
    But also not on some customs aswell , like arg_hunt.

    Why would it be working on some maps and then not others ,

    I can swap and change between maps and back again and it will only work on a few of the maps, the script exec on all maps , just the swapping part of it not working
    Any ideas?

    Purple's Playground
    OBJ :
    103.29.85.127:12203
    xfire: purpleelephant1au
    email: purpleelephant1au@gmail.com
    skydrive: PurpleElephantSkydrive




  6. #36

    Default

    Hello,

    Im running weapon_give_take.crp that give both teams only sniper, so i wanna give player in m2l3 map Bazooka only how this done please ?

    I tried purple Weapon limiter but cant find maps in it to put


    Thanks

  7. #37
    Purple Developer Purple Elephant1au's Avatar
    Join Date
    Feb 2012
    Location
    Australia
    Posts
    1,259

    Default

    My Weapon Limiter is completely CVAR controlled, so you just have to set the cvars on the map for what weapons you want to be allowed

    Purple's Playground
    OBJ :
    103.29.85.127:12203
    xfire: purpleelephant1au
    email: purpleelephant1au@gmail.com
    skydrive: PurpleElephantSkydrive




Page 4 of 4 FirstFirst ... 234

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •